﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Linq.Expressions;
using System.Reflection;
using System.Web.UI.WebControls;
using BIZMA;
using BIZModel;
using BIZMA.BL.Security;
using System.Web.Security;




/// <summary>
/// Summary description for BaseBL
/// </summary>
public class BaseBL
{
	public BaseBL()
	{
		//
		// TODO: Add constructor logic here
		//
	}

    public static Guid FOLDERS_ROOT = Guid.Parse("00000000-0000-0000-0000-000000000001");
    public static Guid FOLDERS_PROJECTROOT = Guid.Parse("00000000-0000-0000-0000-000000000002");

    public static string PHONETYPE_MOBILE = "MOBILE";
    public static string PHONETYPE_WORKDIRECT = "WORKDIRECT";
    public static string PHONETYPE_WORK = "WORK";

    public static string ADDRESSTYPE_ADDRESS = "ADDRESS";

    /// <summary>
    /// Identifierar om det är en användare tex i listor med både användare och grupper
    /// </summary>
    public const string TYPE_USER = "USER";
    /// <summary>
    /// Identifierar om det är en grupp tex i listor med både användare och grupper
    /// </summary>
    public const string TYPE_GROUP = "GROUP";

    private static string ContextUserName { get { return HttpContext.Current.User.Identity.Name; } }
    public static Guid UserId{get{ return GetUserProfile().UserId; } }
    public static Guid AspNetUserId{get{ return GetUserProfile().AspNetUserId; } }
    public static BIZMAUser CurrentUserProfile {get{ return GetUserProfile(); } }
    /// <summary>
    /// Key is UserName
    /// </summary>
    public static string ProviderKey {get{ return GetUserProfile().UserName; } }

    private static BIZMAUser GetUserProfile()
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {

            BIZMAUser userProfile = UserHandler.GetUserProfile(ContextUserName);

            if (userProfile != null)
            {
                return userProfile;
            }
            else
            {
                userProfile = SelectUser();

                //Create a asp net user and UserProfile if not exists 
                if (userProfile == null)
                {

                    BIZMAEntities ent = new BIZMAEntities();
                    string un = HttpContext.Current.User.Identity.Name.ToLower();


                    UserProfile user = UserProfile.CreateUserProfile(Guid.NewGuid(), "", "", 0);
                    user.AspNetUserId = CreateASPUserConnection(un);
                    ent.AddToUserProfiles(user);
                    ent.SaveChanges();

                    userProfile = SelectUser();

                    if (userProfile == null)
                    {
                        throw new Exception("No UserProfile ceated");
                    }


                }
            }


            UserHandler.RefreshUserProfile(ContextUserName, userProfile);
            return userProfile;
        }
        return null;

    }

    private static BIZMAUser SelectUser()
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {

            BIZMAEntities ent = new BIZMAEntities();
            string un = HttpContext.Current.User.Identity.Name.ToLower();

            BIZMAUser userProfile = (from UserProfile user in ent.UserProfiles
                                     join aspnet_Users aspUser in ent.aspnet_Users on user.AspNetUserId equals aspUser.UserId
                                     where aspUser.UserName == un
                                     select new BIZMAUser { AspNetUserId = aspUser.UserId, UserId = user.UserId, UserName = aspUser.UserName, UserInfo = user }).FirstOrDefault();

            if (userProfile != null)
            {
                userProfile.isSA = false;
                if (ent.Security_UserIsSA(userProfile.UserId).First().Value)
                {
                    userProfile.isSA = true;
                }

                List<SystemFunction> SF = new List<SystemFunction>();
                foreach (Security_UserSystemFunction USF in ent.Security_GetUserSystemFunctions(userProfile.UserId))
                {
                    SF.Add(new SystemFunction(USF.FunctionKey, USF.ObjectType));
                }
                userProfile.SystemFunctions = SF;

            }

            return userProfile;
        }

        return null;
    }
    /// <summary>
    /// Creates a ASPNet Users. Use when not using SQLMembership ex when using windows login
    /// </summary>
    /// <returns>AspNetUserId</returns>
    public static Guid CreateASPUserConnection(string userName)
    {
        return CreateASPUserConnection(userName, string.Format("NOMAIL{0}@bizma.codeplex.com",DateTime.Today.Ticks)); 
    }

    /// <summary>
    /// Creates a membership ASP Users. Use when not using SQLMembership ex when using windows login
    /// </summary>
    /// <returns>AspNetUserId</returns>
    public static Guid CreateASPUserConnection(string userName, string email)
    {
        BIZMAEntities ent = new BIZMAEntities();

        MembershipUser MU = null;
        MembershipCreateStatus status = MembershipCreateStatus.ProviderError;
        MU = Membership.CreateUser(userName, Guid.NewGuid().ToString(), email, null, null, true, out status);

        if (status != MembershipCreateStatus.Success)
        {
            throw new Exception("No aspUser ceated");
        }

        return (Guid)MU.ProviderUserKey;
    }


    public static bool AspUserNameExists(string userName)
    {
        BIZMAEntities ent = new BIZMAEntities();
        aspnet_Users aspUser = ent.aspnet_Users.FirstOrDefault(q => q.UserName == userName);

        if (aspUser != null)
        {
            return true;
        }

        return false;
    }


    public static void ClearUserInfoCache()
    {
        UserHandler.ClearUserProfile(ContextUserName);
    }

    /// <summary>
    /// man bör använda den här funktionen för att skapa BIZMAEntities så man bara har ett ställe att ändra på ifall man vill ha en annan connectionstring
    /// </summary>
    /// <returns>BIZMAEntities koppling</returns>
    public static BIZMAEntities GetEnt()
    {
        return new BIZMAEntities();
    }


    #region codeHelpers

    /// <summary>
    /// Backar datum till första dagen i månaden och sätter tiden till 0
    /// </summary>
    /// <param name="date"></param>
    /// <returns></returns>
    public static DateTime GetFirstDayDate(DateTime date)
    {
        if (date.Day > 1)
            date = date.AddDays(-(date.Day - 1));

        if (date.Hour > 0)
            date = date.AddHours(-(date.Hour));
        if (date.Minute > 0)
            date = date.AddMinutes(-(date.Minute));
        if (date.Second > 0)
            date = date.AddSeconds(-(date.Second));
        if (date.Millisecond > 0)
            date = date.AddMilliseconds(-(date.Millisecond));

        return date;
    }

    /// <summary>
    /// Backar datum till första dagen i veckan och sätter tiden till 0
    /// </summary>
    /// <param name="date"></param>
    /// <returns></returns>
    public static DateTime GetFirstWeekDayDate(DateTime date)
    {

        while (date.DayOfWeek != DayOfWeek.Monday)
        {
            date = date.AddDays(-1);
        }

        if (date.Hour > 0)
            date = date.AddHours(-(date.Hour));
        if (date.Minute > 0)
            date = date.AddMinutes(-(date.Minute));
        if (date.Second > 0)
            date = date.AddSeconds(-(date.Second));
        if (date.Millisecond > 0)
            date = date.AddMilliseconds(-(date.Millisecond));

        return date;
    }

    /// <summary>
    /// Skapar ett f.o.m datum med klockslag  00:00:00
    /// </summary>
    /// <param name="date"></param>
    /// <returns></returns>
    public static DateTime GetDateNoTime(DateTime date)
    {
        if (date.Hour > 0)
            date = date.AddHours(-(date.Hour));
        if (date.Minute > 0)
            date = date.AddMinutes(-(date.Minute));
        if (date.Second > 0)
            date = date.AddSeconds(-(date.Second));
        if (date.Millisecond > 0)
            date = date.AddMilliseconds(-(date.Millisecond));

        return date;
    }

    /// <summary>
    /// Skapar ett t.o.m datum med klockslag 23.59.59
    /// </summary>
    /// <param name="date"></param>
    /// <returns></returns>
    public static DateTime GetDateMaxTime(DateTime date)
    {
        date = GetDateNoTime(date);

        date = date.AddHours(23);
        date = date.AddMinutes(59);
        date = date.AddSeconds(59);
        date = date.AddMilliseconds(59);

        return date;
    }


    public static DateTime SafeSqlDate(DateTime date)
    {

        if (date > System.Data.SqlTypes.SqlDateTime.MaxValue.Value)
            return System.Data.SqlTypes.SqlDateTime.MaxValue.Value;

        if (date < System.Data.SqlTypes.SqlDateTime.MinValue.Value)
            return System.Data.SqlTypes.SqlDateTime.MinValue.Value;

        return date;

    }

    /// <summary>
    /// Används för att aktivera/inaktivera knappar som först behöver att något skapas i sidan innan knappen kan ativkeras. Ex man kan inte öppna tidsredovisning för ett ärende om inte ärendet har skapats först.
    /// </summary>
    /// <param name="btn"></param>
    /// <param name="enabled"></param>
    /// <param name="viewState"></param>
    public static void BtnNeedsDataEnabled(WebControl btn, bool enabled, System.Web.UI.StateBag viewState)
    {
        if (enabled)
        {
            btn.Enabled = enabled;
            btn.ToolTip = viewState[btn.ID] != null ? viewState[btn.ID].ToString() : "";

        }
        else
        {
            //Måste spara undan tooltipp för knappen så att den kan sättas tillbaka igen när 
            viewState[btn.ID] = viewState[btn.ID] != null ? viewState[btn.ID].ToString() : btn.ToolTip;
            btn.Enabled = enabled;
            btn.ToolTip = "Det saknas information för denna funktion";
        }
    }

    /// <summary>
    /// Används för att aktivera/inaktivera knappar om dialogen inte kan öppnas
    /// </summary>
    /// <param name="btn"></param>
    /// <param name="enabled"></param>
    /// <param name="viewState"></param>
    public static void BtnOpenEnabled(WebControl btn, bool enabled, System.Web.UI.StateBag viewState )
    {
        if (enabled)
        {
            btn.Enabled = enabled;
            btn.ToolTip = viewState[btn.ID] != null ? viewState[btn.ID].ToString() : "";
            
        }
        else
        {
            //Måste spara undan tooltipp för knappen så att den kan sättas tillbaka igen när 
            viewState[btn.ID] = viewState[btn.ID] != null ? viewState[btn.ID].ToString() : btn.ToolTip;
            btn.Enabled = enabled;
            btn.ToolTip = "Funktionen är redan öppen i en underliggande dialog och kan därför inte öppnas igen";
        }
    }

    /// <summary>
    /// Används för att aktivera/inaktivera knappar beroende på rättigheter
    /// </summary>
    /// <param name="btn"></param>
    /// <param name="enabled"></param>
    /// <param name="viewState"></param>
    public static void BtnPermissionEnabled(WebControl btn, bool enabled, System.Web.UI.StateBag viewState)
    {
        if (enabled)
        {
            btn.Enabled = enabled;
            btn.ToolTip = viewState[btn.ID] != null ? viewState[btn.ID].ToString() : "";

        }
        else
        {
            //Måste spara undan tooltipp för knappen så att den kan sättas tillbaka igen när 
            viewState[btn.ID] = viewState[btn.ID] != null ? viewState[btn.ID].ToString() : btn.ToolTip;
            btn.Enabled = enabled;
            btn.ToolTip = "Du har inte rättigheter till denna funktion";
        }
    }



#endregion
    


}

